import type {
	PadOption,
	NumberFormatOption,
} from './type';
import {
	numberIsFinite,
} from '../math';
//region toCssLength
/**
 * 转换为长度字符串, 没有单位时默认为px
 * @param length 长度
 * @return 带单位的长度值
 */
function toCssLength(length:number|string|null|undefined):string|undefined{
	if(typeof length==='number'){
		if(numberIsFinite(length)){
			return length+'px';
		}else{
			return undefined;
		}
	}else if(typeof length==='string'){
		const convert=Number(length);
		if(numberIsFinite(convert)){
			return convert+'px';
		}else{
			return length;
		}
	}else{
		return undefined;
	}
}
//endregion
//region pad
/**
 * 填充字符串
 * @param value			需要被填充的值
 * @param length		最小位数
 * @param [option]		选项
 * @return 填充后的值
 */
function pad(value:number|string,length:number,option?:PadOption):string{
	const {char='0',start=true}=option||{};
	const val=''+value;
	if(val.length>=length){
		return val;
	}else{
		let pad=char;
		for(let i=length-val.length-1;i>0;--i){
			pad+=char;
		}
		return start?pad+val:val+pad;
	}
}
//endregion
//region numberFormat
/**
 * 格式化金额, 把一个实数格式化为整数部分每3位数一个逗号分隔
 * @param value				被格式化的实数
 * @param [decimalDigits]	保留的小数位数
 * @param [option]			选项
 * @return 格式化后的字符串
 */
function numberFormat(value:number|string,decimalDigits?:number,option?:NumberFormatOption):string{
	const {separator=',',count=3,unit}=option||{};
	if(typeof value==='string'){
		value=Number(value);
	}
	if(!numberIsFinite(value)){
		return value+'';
	}
	let suffix='';
	if(unit){
		[value,suffix]=unit(value);
	}
	value=value.toFixed(decimalDigits);
	if(value.indexOf('e')!==-1){
		return value;
	}
	if(count>0&&separator){
		const p=value.indexOf('.');
		value=p===-1?_integerFormat(value,separator,count):_integerFormat(value.slice(0,p),separator,count)+value.slice(p);
	}
	return value+suffix;
}
/**
 * 格式化金额的整数部分
 * @param value		金额的整数部分
 * @param separator	分隔符
 * @param count		分隔数量
 * @return 格式化后的字符串
 */
function _integerFormat(value:string,separator:string,count:number):string{
	let pre='';
	if(value[0]==='-'){
		pre='-';
		value=value.slice(1);
	}
	const len=value.length;
	let pos=len%count||count;
	let str=value.slice(0,pos);
	while(pos<len){
		const next=pos+count;
		str+=separator+value.slice(pos,next);
		pos=next;
	}
	return pre+str;
}
//endregion
//region storageFormat
const storageUnit=[
	'B',
	'KB',
	'MB',
	'GB',
	'TB',
];
/**
 * 格式化存储数值
 * @param size				比特数
 * @param decimalDigits		小数位数
 * @param [margin='']		数值和单位间的字符串
 * @return 格式化后的字符串
 */
function storageFormat(size:number|string,decimalDigits?:number,margin=''):string{
	return numberFormat(size,decimalDigits,{
		unit(val:number){
			let i=0;
			while(val>=1024&&i<storageUnit.length-1){
				val/=1024;
				++i;
			}
			return [val,margin+storageUnit[i]];
		},
	});
}
//endregion
export {
	toCssLength,
	pad,
	numberFormat,
	storageFormat,
};